/**
 * 1-100的阶乘之和
 * 1*2*3*...*100
 */
/**
 * 递归
 * 缺点：溢出，最大的安全整数为2^53- 1
 */
function factorial1(n) {
  if (n <= 1) return 1;

  return n * factorial1(n - 1);
  // return BigInt(n) * BigInt(factorial1(n - 1));
}

/**
 * 尾递归
 * 函数式编程中有一个概念叫做尾调用，即函数的最后一步调用另一个函数，尾调用自身称之为尾递归，
 * 递归非常耗费内存，因为同时需要保存多个调用帧，容易发生栈溢出。
 * 但对于尾递归来讲，他的调用帧只存在一个所以永远不会发生栈溢出。
 */
function factorial2(n, total = 1) {
  if (n === 1) return total;
  // return factorial2(n - 1, n * total);
  return BigInt(factorial2(n - 1, n * total));
}

console.log(factorial1(100));
console.log(factorial2(100));